package com.sysmanage.common.tools.util;

import java.security.*;
import javax.crypto.*;
import sun.misc.*;

/**
 * 使用DES加密与解密,可对byte[],String类型进行加密与解密 密文可使用String,byte[]存储. 方法: void
 * getKey(String strKey)从strKey的字条生成一个Key String getEncString(String
 * strMing)对strMing进行加密,返回String密文 String getDesString(String
 * strMi)对strMin进行解密,返回String明文 byte[] getEncCode(byte[] byteS)byte[]型的加密 byte[]
 * getDesCode(byte[] byteD)byte[]型的解密
 */
public class Encrypt {
	private Key key;
	public Encrypt()
	{
		try {
			KeyGenerator _generator = KeyGenerator.getInstance("DES");
			_generator.init(new SecureRandom("cqd6303a039223b1c".getBytes()));
			this.key = _generator.generateKey();
			_generator = null;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public Encrypt(String strKey)
	{
		try {
			KeyGenerator _generator = KeyGenerator.getInstance("DES");
			_generator.init(new SecureRandom(strKey.getBytes()));
			this.key = _generator.generateKey();
			_generator = null;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	// 根据参数生成KEY
	public void setKey(String strKey) {
		try {
			KeyGenerator _generator = KeyGenerator.getInstance("DES");
			_generator.init(new SecureRandom(strKey.getBytes()));
			this.key = _generator.generateKey();
			_generator = null;
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	// 加密String明文输入,String密文输出
	public String encString(String strMing) {
		String strMi = null; 
		/*
		BASE64Encoder base64en = new BASE64Encoder();
		try {
			byte[] byteMing = strMing.getBytes("UTF8");
			byte[] byteMi = this.getEncCode(byteMing);
			strMi = base64en.encode(byteMi);			
		} catch (Exception e) {
			e.printStackTrace();
		}
		*/
		strMi = this.MD5(strMing);
		return strMi;
	}

	// 加密以byte[]明文输入,byte[]密文输出
	private byte[] getEncCode(byte[] byteS) {
		byte[] byteFina = null;
		Cipher cipher;
		try {
			cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, key);
			byteFina = cipher.doFinal(byteS);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			cipher = null;
		}

		return byteFina;
	}

	// 解密:以String密文输入,String明文输出
	public String desString(String strMi) {
		String strM = null;		
		BASE64Decoder base64De = new BASE64Decoder();
		try {
			byte[] byteMi = base64De.decodeBuffer(strMi);
			byte[] byteMing = this.getDesCode(byteMi);
			strM = new String(byteMing, "UTF8");
		} catch (Exception e) {
			e.printStackTrace();
		}		
		return strM;
	}

	// 解密以byte[]密文输入,以byte[]明文输出
	private byte[] getDesCode(byte[] byteD) {
		Cipher cipher;
		byte[] byteFina = null;
		try {
			cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.DECRYPT_MODE, key);
			byteFina = cipher.doFinal(byteD);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			cipher = null;
		}
		return byteFina;
	}

	public String MD5(String s) {
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'A', 'B', 'C', 'D', 'E', 'F' };
		try {
			byte[] strTemp = s.getBytes();
			MessageDigest mdTemp = MessageDigest.getInstance("MD5");
			mdTemp.update(strTemp);
			byte[] md = mdTemp.digest();

			int j = md.length;
			char str[] = new char[j * 2];
			int k = 0;
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (Exception e) {
			return null;
		}
	}
	// 加密String明文输入,String密文输出
	public String DES(String strMing) {
		String strMi = null; 		
		BASE64Encoder base64en = new BASE64Encoder();
		try {
			byte[] byteMing = strMing.getBytes("UTF8");
			byte[] byteMi = this.getEncCode(byteMing);
			strMi = base64en.encode(byteMi);			
		} catch (Exception e) {
			e.printStackTrace();
		}		
		return strMi;
	}	
	public static void main(String[] args) {
		Encrypt enc = new Encrypt();
		String test = enc.MD5("admin123");
		String pass = enc.encString("admin123");
		System.out.println(pass);
		String depass = enc.DES("admin123");
		System.out.println(test);
		System.out.println(depass);
	}
}